package IT.DataAccess;

import IT.Entities.Cliente;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class DatCliente implements IDatCliente{
    
    private List<Cliente> oLista ;
    private Cliente oCliente;
    private BDConexion oBase;
    
    private Connection oConexion;
    private CallableStatement oCst;    
    private ResultSet oRst;    
 
    public List<Cliente> Listar() {
        
        oLista = new ArrayList<Cliente>();
         
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ClienteListar()}");
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oLista.add(new Cliente(oRst.getInt("cod_cli_in"), 
                        oRst.getInt("tip_cli_in"), oRst.getString("Tipo"), 
                        oRst.getInt("tip_doc_cli_in"), oRst.getString("TipoDoc"), 
                        oRst.getString("num_doc_cli_vc"), oRst.getString("nom_cli_vc"), 
                        oRst.getString("ape_pat_cli_vc"), oRst.getString("ape_mat_cli_vc"), 
                        oRst.getString("Cliente"), oRst.getString("cor_cli_vc"), 
                        oRst.getInt("est_cli_in"), oRst.getString("Estado"),
                        oRst.getInt("Telefono"),oRst.getInt("Direccion"),oRst.getInt("Contacto"),
                        oRst.getInt("tip_ori_cli_in"),
                        oRst.getInt("cod_emp_in"),
                        oRst.getString("Empleado"),
                        oRst.getInt("cod_pro_in")));
            }
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
         return oLista;
    }
    
    public List<Cliente> Buscar(int nEmpleado,String cBuscar,int nEstado) {
        oLista = new ArrayList<Cliente>();
         
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ClienteBuscar(?,?,?)}");
            oCst.setInt(1, nEmpleado);
            oCst.setString(2, cBuscar);
            oCst.setInt(3, nEstado);
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oLista.add(new Cliente(oRst.getInt("cod_cli_in"), 
                        oRst.getInt("tip_cli_in"), oRst.getString("Tipo"), 
                        oRst.getInt("tip_doc_cli_in"), oRst.getString("TipoDoc"), 
                        oRst.getString("num_doc_cli_vc"), oRst.getString("nom_cli_vc"), 
                        oRst.getString("ape_pat_cli_vc"), oRst.getString("ape_mat_cli_vc"), 
                        oRst.getString("Cliente"), oRst.getString("cor_cli_vc"), 
                        oRst.getInt("est_cli_in"), oRst.getString("Estado"),
                        oRst.getInt("Telefono"),oRst.getInt("Direccion"),oRst.getInt("Contacto"),
                        oRst.getInt("tip_ori_cli_in"),
                        oRst.getInt("cod_emp_in"),
                        oRst.getString("Empleado"),
                        oRst.getInt("cod_pro_in")));
            }
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
         return oLista;
    }

    public Cliente Ind(int nCodigo) {
        
        oCliente=new Cliente();
         
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ClienteInd(?)}");
            oCst.setInt(1, nCodigo);
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oCliente.setCod_cli_in(oRst.getInt("cod_cli_in"));
                oCliente.setTip_cli_in(oRst.getInt("tip_cli_in"));
                oCliente.setTipo( oRst.getString("Tipo")); 
                oCliente.setTip_doc_cli_in(oRst.getInt("tip_doc_cli_in"));
                oCliente.setTipoDoc(oRst.getString("TipoDoc")); 
                oCliente.setNum_doc_cli_vc(oRst.getString("num_doc_cli_vc"));
                oCliente.setNom_cli_vc(oRst.getString("nom_cli_vc")); 
                oCliente.setApe_pat_cli_vc(oRst.getString("ape_pat_cli_vc"));
                oCliente.setApe_mat_cli_vc(oRst.getString("ape_mat_cli_vc"));
                oCliente.setCliente(oRst.getString("Cliente"));
                oCliente.setCor_cli_vc(oRst.getString("cor_cli_vc"));
                oCliente.setEst_cli_in(oRst.getInt("est_cli_in"));
                oCliente.setEstado(oRst.getString("Estado"));
                oCliente.setCantidadTelefono( oRst.getInt("Telefono"));
                oCliente.setCantidadDireccion(oRst.getInt("Direccion"));
                oCliente.setCantidadContacto(oRst.getInt("Contacto"));
                oCliente.setTip_ori_cli_in(oRst.getInt("tip_ori_cli_in"));     
                oCliente.setCod_emp_in(oRst.getInt("cod_emp_in"));
                oCliente.setEmpleado(oRst.getString("Empleado"));
                oCliente.setCod_pro_in(oRst.getInt("cod_pro_in"));
       
            }
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }        
        return oCliente;
    }
    
    public List<Cliente> Titulo(int nEstado) {
        oLista = new ArrayList<Cliente>();
         
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ClienteTitulo(?)}");
            oCst.setInt(1, nEstado);
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oCliente=new Cliente();
                oCliente.setCod_cli_in(oRst.getInt("cod_cli_in"));
                oCliente.setCliente(oRst.getString("Cliente"));             
                oLista.add(oCliente);
            }
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
         return oLista;
    }
    
    public List<Cliente> ConsultaProyecto() {
        oLista = new ArrayList<Cliente>();
         
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ClienteConsultaProyecto()}");            
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oCliente=new Cliente();
                oCliente.setCod_cli_in(oRst.getInt("cod_cli_in"));
                oCliente.setTip_cli_in(oRst.getInt("Tipo"));
                oCliente.setCliente(oRst.getString("Cliente"));             
                oLista.add(oCliente);
            }
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
         return oLista;
    }
 
    public int Insertar(Cliente ent) {
       int nCodigo=0;
       try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ClienteInsertar(?,?,?, ?,?,?, ?,?,?, ?,?,?)}");                 
            oCst.registerOutParameter(1, java.sql.Types.INTEGER);
            oCst.setInt(2, ent.getTip_cli_in());
            oCst.setInt(3, ent.getTip_doc_cli_in());
            oCst.setString(4, ent.getNum_doc_cli_vc());
            oCst.setString(5, ent.getNom_cli_vc());
            oCst.setString(6, ent.getApe_pat_cli_vc());
            oCst.setString(7, ent.getApe_mat_cli_vc());
            oCst.setString(8, ent.getCor_cli_vc());
            oCst.setInt(9, ent.getEst_cli_in());
            oCst.setInt(10, ent.getTip_ori_cli_in());
            oCst.setInt(11, ent.getCod_emp_in());
            oCst.setInt(12, ent.getCod_pro_in());
            oCst.execute();
            nCodigo=oCst.getInt(1);
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
       return nCodigo;
    }

    public void Editar(Cliente ent) {
   
       try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ClienteEditar(?,?,?, ?,?,?, ?,?,?, ?)}");                 
            oCst.setInt(1, ent.getCod_cli_in());
            oCst.setInt(2, ent.getTip_cli_in());
            oCst.setInt(3, ent.getTip_doc_cli_in());
            oCst.setString(4, ent.getNum_doc_cli_vc());
            oCst.setString(5, ent.getNom_cli_vc());
            oCst.setString(6, ent.getApe_pat_cli_vc());
            oCst.setString(7, ent.getApe_mat_cli_vc());
            oCst.setString(8, ent.getCor_cli_vc());
            oCst.setInt(9, ent.getEst_cli_in());
            oCst.setInt(10, ent.getTip_ori_cli_in());
            oCst.execute();        
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }      
    }

    public int Eliminar(int nCodigo) {
      int nResultado=0;
       try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ClienteEliminar(?,?)}");                          
            oCst.setInt(1, nCodigo);
            oCst.registerOutParameter(2,  java.sql.Types.INTEGER);
            oCst.execute();        
            nResultado=oCst.getInt(2);
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }    
      return nResultado;
    }

    public int ValidaDoc(Cliente ent) {
       int nResultado=0;
       try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ClienteDocValida(?,?,?, ?)}");                             
            oCst.setInt(1, ent.getCod_cli_in());
            oCst.setInt(2, ent.getTip_doc_cli_in());
            oCst.setString(3, ent.getNum_doc_cli_vc());       
            oCst.registerOutParameter(4, java.sql.Types.INTEGER);  
            oCst.execute();
            nResultado=oCst.getInt(4);
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
       return nResultado;
    }


}
